# Структурный шаблон проектирования ("Мост")
# Используется для разделения абстракции и реализации, так чтобы они могли изменяться независимо


import abc


class IDateReader(metaclass=abc.ABCMeta):
    @abc.abstractmethod
    def read(self):
        pass


class DatabaseReader(IDateReader):
    def read(self):
        print("Данные из базы ", end='')


class FileReader(IDateReader):
    def read(self):
        print("Данные из файла ", end="")


class Sender(metaclass=abc.ABCMeta):
    def __init__(self, data_reader: IDateReader):
        self.reader: IDateReader = data_reader

    def set_data_reader(self, data_reader: IDateReader):
        self.reader: IDateReader = data_reader

    @abc.abstractmethod
    def send(self):
        pass


class EmailSender(Sender):
    def __init__(self, data_reader: IDateReader):
        super().__init__(data_reader)

    def send(self):
        self.reader.read()
        print('отправлены при помощи Email')


class TelegramSender(Sender):
    def __init__(self, data_reader: IDateReader):
        super().__init__(data_reader)

    def send(self):
        self.reader.read()
        print("отправлены при помощи Telegram бота")


if __name__ == "__main__":
    sender: Sender = EmailSender(
        DatabaseReader()
    )
    sender.send()

    sender.set_data_reader(FileReader())
    sender.send()

    sender = TelegramSender(
        DatabaseReader()
    )
    sender.send()

# Данные из базы отправлены при помощи Email
# Данные из файла отправлены при помощи Email
# Данные из базы отправлены при помощи Telegram бота
